import axios from  'axios'
//非组件模块获取vuex
import store from '@/store/index'
//解决返回id大数字
import JSONbig from 'json-bigint'
//引入vant toast提示
import { Toast } from 'vant'

import router from '@/router/index'

const refreshTokenReq = axios.create({
  baseURL:'http://ttapi.research.itcast.cn',
})

const request=axios.create({
  baseURL:'http://ttapi.research.itcast.cn',
  transformResponse: [function (data) {
    try {
      // 如果转换成功，则直接把结果返回
      return JSONbig.parse(data)
    } catch (err) {
      console.log('转换失败', err)
      // 如果转换失败了，则进入这里
      // 我们在这里把数据原封不动的直接返回给请求使用
      return data
    }

    // axios 默认在内部使用 JSON.parse 来转换处理原始数据
    // return JSON.parse(data)
  }]
})

//请求拦截器
request.interceptors.request.use(function (config) {
  // Do something before request is sent
  const {user} = store.state
  //若已经登录统一给接口设置token信息
  if(user){
    config.headers.Authorization = `Bearer ${user.token}`
  }
  return config;
}, function (error) {
  // Do something with request error
  return Promise.reject(error);
});
//响应拦截器
request.interceptors.response.use(function (response) {
  
  return response;
},async function (error) {
  const status = error.response.status
  if(status == 400){
    //客户端参数错误
    Toast.fail('客户端请求参数异常')
  }else if(status == 401){
    //token无效
    //没有user 或user.token 直接登录
    const { user } = store.state
    if(!user || !user.token){
      return redirectLogin()
    }
    //如果有 refresh_token，则请求获取新的token
    try {
      const { data } = await refreshTokenReq({
        method: 'PUT',
        url: '/app/v1_0/authorizations',
        headers: {
          Authorization: `Bearer ${user.refresh_token}`
        }
      })

      // 拿到新的 token 之后把它更新到容器中
      user.token = data.data.token
      store.commit('setUser', user)

      // 把失败的请求重新发出去
      // error.config 是本次请求的相关配置信息对象
      // 这里使用 request 发请求，它会走自己的拦截器
      // 它的请求拦截器中通过 store 容器访问 token 数据
      return request(error.config)
    } catch (err) {
      // 刷新 token 都失败了，直接跳转登录页
      redirectLogin()
    }

  }else if(status == 403){
    //没有权限
    Toast.fail('没有权限操作')
  }else if(status >=500){
    //服务端异常
    Toast.fail('服务端异常，请稍后重试')
  }
  return Promise.reject(error);
});

function redirectLogin(){
  router.replace({
    name:'login',
    query:{
      redirect: router.curerentRoute.fullPath
    }
  })
}


export default request
